// 封装购物车模块
import { defineStore } from "pinia";
import { computed, ref } from "vue";
import { useUserStore } from '@/stores/user'
// 引入cart接口中的API
import { insertCartAPI, findNewCartListAPI, delCartAPI } from '@/apis/cart'

export const useCartStore = defineStore('cart', () => {
    // 获取用户数据的实例对象
    const userStore = useUserStore()
    // 判断是否登录（判断是否存在token）token从useUserStore中获取
    const isLogin = computed(() => userStore.userInfo.token)
    // 1.定义state - cartList
    const cartList = ref([])

    // 2.定义action -addCart
    const addCart = async (goods) => {
        const { skuId, count } = goods
        if (isLogin.value) {
            // 如果登录了走登录的逻辑
            // 调用加入购物车函数 参数是一个对象
            await insertCartAPI({ skuId, count })
            // 获取购物车信息，重新渲染
            await updateNewList()
        } else {
            // 添加购物车的操作
            // 已经添加过 - count + 1
            // 没有添加过 直接push
            // 思路：判断传递过来的参数中的skuId能不能在cartList中找到，找到就是添加过
            const item = cartList.value.find((item) => goods.skuId === item.skuId)
            if (item) {
                // 找到了  是某一个商品的数量 + 1
                item.count++
            } else {
                // 没找到
                cartList.value.push(goods)
            }
        }

    }

    // 获取最新购物车列表action
    const updateNewList = async () => {
        const res = await findNewCartListAPI()
        cartList.value = res.result
    }

    // 删除购物车商品
    const delCart = async (skuId) => {
        if (isLogin.value) {
            // 调用接口实现删除购物车的功能
            await delCartAPI([skuId])
            await updateNewList()
        } else {
            // 思路：
            // 1.找到要删除的下标 -splice
            // 2.使用数组的过滤方法 -filter
            // 获取要删除的商品的下标
            const index = cartList.value.findIndex((item) => {
                skuId === item.index
            })
            // 删除对应商品
            cartList.value.splice(index, 1)
        }
    }

    // 清除购物车信息
    const clearCart = () => {
        cartList.value = []
    }

    // 计算属性
    // 1.商品的总数量 allCount
    const allCount = computed(() => {
        return cartList.value.reduce((perValue, currentValue) => {
            return perValue + currentValue.count
        }, 0)
    })
    // 2.总价 allPrice
    const allPrice = computed(() => {
        return cartList.value.reduce((perValue, currentValue) => {
            return perValue + currentValue.count * currentValue.price
        }, 0)
    })
    // 3.已选择商品的数量  注意 ，0的位置
    const selectedCount = computed(() => cartList.value.filter(item => item.selected).reduce((perValue, currentValue) => perValue + currentValue.count, 0))

    // 4.已选择商品的价格  注意，0的位置
    const selectedPrice = computed(() => cartList.value.filter(item => item.selected).reduce((perValue, currentValue) => perValue + currentValue.count * currentValue.price, 0))

    // 是否全选 箭头函数要是用{}需要写return
    const isAll = computed(() => cartList.value.every((item) => item.selected))

    // 全选功能函数
    const allCheck = (selected) => {
        // forEach函数
        cartList.value.forEach((item) => {
            return item.selected = selected
        })
    }

    // 切换单选功能
    const singleCheck = (skuId, selected) => {
        // 通过参数skuId找到要处理的那一项，把selected修改为传来的selected
        const item = cartList.value.find((item) => item.skuId === skuId)
        item.selected = selected
    }

    return {
        cartList,
        addCart,
        delCart,
        clearCart,
        updateNewList,
        selectedCount,
        selectedPrice,
        allCheck,
        isAll,
        allCount,
        allPrice,
        singleCheck
    }
}, {
    // 这里是用来加入pinia插件的，现在下载不了，还没有解决掉这个问题  前面也有一个这样的问题
    persist: true
})
